﻿using PengSW.XmlHelper;
using System;

namespace PengSW.Schedule
{
    /// <summary>
    /// 计划任务接口定义
    /// </summary>
    public interface ISchedule : IXmlSeriable
    {
        /// <summary>
        /// 计划任务的描述
        /// </summary>
        string Description { get; set; }

        /// <summary>
        /// 计划任务是否已经启用，只有当IsStart为true时，管理器才会调度执行计划任务的OnDispatch方法。
        /// 通过调用Start和Stop方法启用和停止计划任务。
        /// </summary>
        bool IsStart { get; }
        /// <summary>
        /// 设置计划任务为启用状态，允许被调度。
        ///     计划任务应在此方法中初始化NextDispathTime，来指定第一次被调度的时间。
        /// </summary>
        void Start();
        void Stop();

        /// <summary>
        /// 当启用计划任务时，首次执行时间距启用时间的时间间隔。
        /// </summary>
        TimeSpan StartInterval { get; }

        /// <summary>
        /// 调度周期，每隔Interval，管理器将执行一次对计划任务的OnDispatch的调度执行。
        /// </summary>
        TimeSpan Interval { get; }

        /// <summary>
        /// 下一次调度时间，在调度过程中由管理器维护并使用。
        /// </summary>
        DateTime NextDispatchTime { get; set; }

        /// <summary>
        /// IsEditable表示计划任务是否允许被编辑修改，true表示允许被编辑修改。
        /// </summary>
        bool IsEditable { get; }

        /// <summary>
        /// 对计划任务进行编辑，只有当IsEditable为true，才应允许调用此方法。
        /// </summary>
        void Edit();

        /// <summary>
        /// 反馈是否正被调度执行中
        /// </summary>
        bool IsDispatching { get; set; }

        /// <summary>
        /// 计划任务调度响应，是执行计划任务具体操作的方法。管理器通过调用此方法执行计划任务。
        /// OnDispatch执行过程中，应维护IsDispatching状态。
        /// </summary>
        void OnDispatch(object aContent);
    }
}
